/*********************************************************************
 * vector的一般用法总结：
 * 1、什么是vector
 *    vector就是一个动态数组，存储相同类型的数据，每次扩展容量都是成倍的扩展
 * 2、为什么会有vector
 *    1、数据存储在堆上，方便动态扩展；2、方便使用数组的特性。
 * 3、如何使用vector
 *    参见vector的各种用法总结
 * ******************************************************************/
#include "common.h"
using namespace std;

void Vec::push_item(int item)
{
    vec.push_back(item);
}

void Vec::remove_item(int item)
{
    auto iter = find(vec.begin(), vec.end(), item);
    if (iter != vec.end()) {
        vec.erase(iter);
    }
}

size_t Vec::get_size()
{
    return vec.size();
}

bool Vec::is_empty()
{
    return vec.empty();
}

void Vec::show_first_back_item()
{
    int front = vec.front();
    int back = vec.back();
    printf("vec first = %d, back = %d\n", front, back);
}

void Vec::reserve(int count)
{
    vec.reserve(count);
}

void Vec::pop_back()
{
    vec.pop_back(); // 删除最后一个元素
}

void Vec::is_clear()
{
    vec.clear();
}

void Vec::show_vec()
{
    for (auto& iter : vec) {
        printf("%d\n",iter);
    }
}

void Vec::show_size_capacity()
{
    /***********************************************
     * size: 表示实际容器中保存元素的个数
    *  capaciy: 表示在发生重新分配之前允许存放多少元素
     * ********************************************/
    int size = vec.size();
    int capacity = vec.capacity();
    printf("vec size = %d, capacity = %d\n", size, capacity);
}

int main()
{
    Vec vec;
    for (int index = 0; index < 10; index++) {
        vec.push_item(index);
    }
    vec.remove_item(0);
    vec.remove_item(9);
    vec.show_size_capacity(); // vec size = 9, capacity = 16
    vec.show_first_back_item();

    vec.reserve(20);
    vec.show_size_capacity();

    vec.pop_back();
    vec.show_size_capacity();
    vec.show_vec();

    vec.is_clear();
    vec.show_size_capacity();

    return 0;
}